package file.listener;

import file.FileFrame;
import file.exception.FileException;
import file.handle.FilePannel;
import file.model.FileModel;
import file.model.FilePannelModel;

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;

/**
 * 文件区域被选中
 * @Author: zou
 * @email: 704572528@qq.com
 * @Date: 2020/10/30 10:40
 */
public class FilePanelListener extends FileFrameAbstract implements MouseListener {

    private FilePannelModel filePannelModel;

    public static FilePannelModel FILEPANEL;
    private FilePannel fileHandel = new file.handle.impl.FilePannelImpl(fileFrame);

    /**
     * 是否高亮
     */
    public static Boolean isHighlight = false;

    public FilePanelListener(FileFrame fileFrame, FilePannelModel fpm) {
        super(fileFrame);
        this.filePannelModel = fpm;
    }

    /**
     * 鼠标点击进去的时候 -> 是否是文件夹 -> 改变路径 -> 改变试图
     *
     * @param e
     */
    @Override
    public void mouseClicked(MouseEvent e) {
        // 鼠标双击二小才激活
        if (e.getClickCount() == 2) {

            FileModel fileModel = filePannelModel.getFileModel();
            if (!fileModel.getFolder()) {
                throw new FileException("这个不是文件夹！请重新选择！");
            } else {
                // this.runExe();
            }
            // 改变路径
            String fullName = filePannelModel.getFullName();
            setPathLablePath(fullName);
            // 改变试图
            changePanel(fullName);
            // 清除hiddleLable
            cleanHiddleLable();
            isHighlight = false;
        }


    }

    private void runExe() {
        String path = fileFrame.getHiddleLable().getText();
        try {
            Runtime rt = Runtime.getRuntime();//返回与当前 Java 应用程序相关的运行时对象。
            rt.exec(path); //Runtime.exec 方法创建一个本机进程,在单独的进程中执行指定的字符串命令。
        } catch (IOException e) {
            e.printStackTrace();

        }
        System.exit(0);// System.exit方法是调用此方法的一种传统而便捷的方式。

    }

    /**
     * 清楚lable
     */
    private void cleanHiddleLable() {
        fileFrame.getHiddleLable().setText("");

    }

    /**
     * 改变试图
     *
     * @param fullName
     */
    private void changePanel(String fullName) {
        JPanel filePanel = fileFrame.getFilePanel();
        fileHandel.removeFile(fileFrame.getFilePanel());
        fileHandel.fileHandel(new File(fullName), filePanel);
    }

    /**
     * 鼠标按下的时候 高亮 -> 设置 隐藏局域的值
     *
     * @param e
     */
    @Override
    public void mousePressed(MouseEvent e) {
        // 不是上一个对象时
        if (filePannelModel != FILEPANEL) {
            highColor();
            visibleMenu(e);
            if (FILEPANEL != null) {
                // 删除高亮
                removeBackGround(FILEPANEL);
            }
            FILEPANEL = filePannelModel;
            isHighlight = true;
        } else {
            // 初次点靓
            if (!isHighlight) {
                isHighlight = true;
                highColor();
                visibleMenu(e);
            } else {
                removeBackGround(filePannelModel);
                cleanHiddleLable();
                isHighlight = false;
            }
        }

    }

    /**
     * 显示菜单
     *
     * @param event
     */
    private void visibleMenu(MouseEvent event) {
        int mods = event.getModifiers();
        // 鼠标右键在显示菜单
        if ((mods & InputEvent.BUTTON3_MASK) != 0) {
            fileFrame.getMenu().show(event.getComponent(), event.getX(), event.getY());
        }
    }


    private void highColor() {
        filePannelModel.getImagePannel().setBackground(new Color(203, 208, 212, 130));
        filePannelModel.getTextPannel().setBackground(new Color(203, 208, 212, 130));
        System.out.println(filePannelModel.getFileModel().getPathAndName());
        fileFrame.getHiddleLable().setText(filePannelModel.getFileModel().getPathAndName());
    }

    /**
     * 鼠标释放
     *
     * @param e
     */
    @Override
    public void mouseReleased(MouseEvent e) {
        // this.removeBackGround(filePannelModel);
    }

    /**
     * 清空颜色
     *
     * @param jpanel
     */
    private void removeBackGround(FilePannelModel jpanel) {
        jpanel.getImagePannel().setBackground(new Color(238, 238, 238));
        jpanel.getTextPannel().setBackground(new Color(238, 238, 238));
    }

    /**
     * 鼠标移入事件
     *
     * @param e
     */
    @Override
    public void mouseEntered(MouseEvent e) {

    }

    /**
     * 鼠标移开
     *
     * @param e
     */
    @Override
    public void mouseExited(MouseEvent e) {

    }
}
